package com.stillalive.mq.mqserver.core;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

/**
 * 这里需要进行网络通信和文件写入，因此需要序列化和反序列化
 * 由于json本质上是文本格式，我们这里文件存储的是二进制格式
 * 因此使用标准库自带的方式进行序列化与反序列化
 */

@Getter
@Setter
public class Message implements Serializable {
    private BasicProperties basicProperties = new BasicProperties();
    private byte[] body;

    // Message在文件中位置的偏移量，单位均为字节
    // 约定为[offsetBeg, offsetEnd)
    // 这两个属性不需要被序列化（用关键字修饰），本身作用就是为了让内存中Message对象能够快速找到文件内容
    private transient long offsetBeg = 0;
    private transient long offsetEnd = 0;

    // 文件是否有效（逻辑删除）
    // 0x1表示有效，0x0表示无效
    private byte isValid  = 0x1;

    // 一个工厂方法，封装创建Message对象的过程
    // 自动生成唯一的MessageId
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body ) {
        Message message = new Message();
        if(basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        // 此处生成的是message的核心内容，offsetBeg，offsetEnd，isVaild等在消息持久化的时候才会用到，此处暂不设置
        message.setMessageId("M-" + UUID.randomUUID());
        message.setRoutingKey(routingKey);
        message.setBody(body);
        return message;
    }

    public String getMessageId(){
        return basicProperties.getMessageId();
    }
    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }
    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }
    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }
    public int  getDeliverMode(){
        return basicProperties.getDeliverMode();
    }
    public void setDeliverMode(int deliverMode){
        basicProperties.setDeliverMode(deliverMode);
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEnd=" + offsetEnd +
                ", isValid=" + isValid +
                '}';
    }
}
